home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
graphics
/
c3d2raw.zoo
/
cad3d2raw.c
next >
Wrap
C/C++ Source or Header
|
1994-04-05
|
11KB
|
410 lines
/*
* cad3d2raw - Atari CAD-3D 2.0 to RAW triangles
* $Id: cad3d2raw.c,v 1.2 1994/04/05 14:36:21 herborth Exp $
*
* Chris Herborth
* March 5/94
*
* This program will convert a CAD-3D file into a dump of RAW triangles
* suitable for processing with raw2pov or other programs.
*
* Todo: include lighting information in the RAW dump (if there's some
* way raw2pov can deal with it)
*
* $Log: cad3d2raw.c,v $
* Revision 1.2 1994/04/05 14:36:21 herborth
* Fixed bogus usage message.
*
* Revision 1.1 1994/03/14 15:23:37 herborth
* Initial revision
*
*/
#include <unistd.h> /* needed for malloc() */
#include <stdio.h> /* input/output stuff */
#include <string.h> /* needed for strrchr() */
#include <stdlib.h> /* needed for malloc() */
#include "cad3d2raw.h" /* function prototypes, etc */
#include "cad3dobj.h" /* CAD-3D file structures */
short cad3dobj_as_raw( FILE *fp, const CAD3D_OBJECT *obj,
const CAD3D_HEADER *head );
#define VERBOSE 0x0001 /* verbose flag */
#define NOISY 0x0002 /* debug flag */
#define NO_OUTFILE 0x0004 /* no output file specified flag */
#define COLOURS 0x0008 /* use CAD-3D colours in file */
#define COLOUR_BASE 0x0010 /* use colour group base */
#define BOZO 0x8000 /* Quit ASAP, bad options given */
short flags = 0;
int main( int argc, char **argv )
{
char *input_filename = "",
*output_filename = "";
FILE *input_stream,
*output_stream;
short loop,
retval; /* A spot to stick return values */
CAD3D_HEADER header;
CAD3D_OBJECT *objects;
/* Check to see if the user doesn't know what they're doing... */
if( argc < 2 )
{
usage();
return 1;
}
/* Parse the command-line arguments... */
for( loop = 1; loop < argc; loop++ )
{
char *arg;
arg = argv[loop];
if( arg[0] == '-' )
switch( arg[1] )
{
case 'V':
version();
break;
case 'h':
case '?':
usage();
break;
case 'c':
flags |= COLOURS;
break;
case 'b':
flags |= COLOUR_BASE;
break;
case 'v':
flags |= VERBOSE;
break;
case 'd':
flags |= ( NOISY | VERBOSE );
break;
default:
fprintf( stderr, "Unknown option \"%s\"!\n", arg );
flags |= BOZO;
break;
}
else
if( strlen( input_filename ) == 0 )
input_filename = arg;
else
if( strlen( output_filename ) == 0 )
output_filename = arg;
else
{
fprintf( stderr, "Extra file argument: %s\n", arg );
flags |= BOZO;
}
}
/* Check to see if the user entered some mutant args... */
if( flags & BOZO )
{
fprintf( stderr, "Error parsing arguments.\n" );
return 1;
}
/* Check to see if we've got an input file... */
if( strlen( input_filename ) == 0 )
{
fprintf( stderr, "No input filename specified.\n" );
return 1;
}
/* Check to see if we need to create an output filename... */
if( strlen( output_filename ) == 0 )
{
flags |= NO_OUTFILE;
output_filename = make_outfile( input_filename, output_extension );
}
if( flags & NOISY )
{
fprintf( stderr, "Debugging messages enabled.\n" );
if( flags & VERBOSE )
fprintf( stderr, "Verbose messages enabled.\n" );
fprintf( stderr, "Input filename: %s\n", input_filename );
if( flags & NO_OUTFILE )
fprintf( stderr, "Program will create an output filename: %s.\n",
output_filename );
else
fprintf( stderr, "Output filename: %s\n", output_filename );
if( flags & COLOURS )
{
fprintf( stderr, "Using triangle colours.\n" );
fprintf( stderr, "(Will produce a Fractint RAW file.)\n" );
}
if( flags & COLOUR_BASE )
{
fprintf( stderr, "Using triangle base colours.\n" );
fprintf( stderr, "(Will produce a Fractint RAW file.)\n" );
}
}
/* Open our input/output files */
input_stream = fopen( input_filename, "rb" );
if( input_stream == NULL )
{
fprintf( stderr, "Can't open input file: %s\n", input_filename );
return 1;
}
output_stream = fopen( output_filename, "w" );
if( output_stream == NULL )
{
fprintf( stderr, "Can't open output file: %s\n", output_filename );
fclose( input_stream );
return 1;
}
if( flags & VERBOSE )
fprintf( stderr, "Reading file header...\n" );
retval = get_cad3d_header( input_stream, &header );
if( retval != 0 )
switch( retval )
{
case -1:
fprintf( stderr, "Error reading file: %s\n", output_filename );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
case -2:
fprintf( stderr, "Bad CAD-3D file id: %x\n", header.file_id );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
default:
fprintf( stderr, "Unknown error code %d from get_cad3d_header!\n",
retval );
break;
}
if( flags & NOISY )
retval = dump_cad3d_header( stderr, &header );
/* Load the objects from the 3d2 file... */
if( flags & VERBOSE )
fprintf( stderr, "Reading objects...\n" );
objects = (CAD3D_OBJECT *)malloc( header.num_objects * sizeof( CAD3D_OBJECT ) );
if( objects == NULL )
{
fprintf( stderr, "Can't allocate memory for objects!\n" );
fclose( input_stream );
fclose( output_stream );
return 2;
}
for( loop = 0; loop < header.num_objects; loop++ )
{
retval = get_cad3d_object( input_stream, &(objects[loop]) );
if( retval != 0 )
switch( retval )
{
case -1:
fprintf( stderr, "Error reading object %d!\n", loop );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
case -2:
fprintf( stderr, "Can't allocate memory for vertices in object %d!\n",
loop );
fclose( input_stream );
fclose( output_stream );
return 2;
/* break; */
case -3:
fprintf( stderr, "Error reading %d vertices for object %d!\n",
objects[loop].num_vertices, loop );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
case -4:
fprintf( stderr, "Can't allocate memory for triangles in object %d!\n",
loop );
fclose( input_stream );
fclose( output_stream );
return 2;
/* break; */
case -5:
fprintf( stderr, "Error reading %d triangles for object %d!\n",
objects[loop].num_triangles, loop );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
default:
fprintf( stderr, "Unknown error code %d from get_cad3d_object!\n",
retval );
break;
}
if( flags & VERBOSE )
fprintf( stderr, "Loaded object %d, \"%s\" with %d vertices and %d triangles...\n",
loop, objects[loop].name, objects[loop].num_vertices,
objects[loop].num_triangles );
if( flags & NOISY )
retval = dump_cad3d_object( stderr, &(objects[loop]) );
}
/* Now that we've loaded the objects, dump them to a RAW file. */
fprintf( output_stream, "{ RAW file created with cad3d2raw }\n\n" );
for( loop = 0; loop < header.num_objects; loop++ )
{
if( flags & NOISY )
fprintf( stderr, "Dumping object %d, \"%s\", to RAW...\n",
loop, objects[loop].name );
retval = cad3dobj_as_raw( output_stream, &(objects[loop]), &header );
if( retval != 0 )
switch( retval )
{
case -1:
fprintf( stderr, "Bad stream or object in cad3dobj_as_raw!\n" );
fflush( output_stream );
fclose( input_stream );
fclose( output_stream );
return 1;
/* break; */
default:
fprintf( stderr, "Unknown return value %d from cad3dobj_as_raw!\n",
retval );
break;
}
}
fflush( output_stream );
fclose( input_stream );
fclose( output_stream );
/* All's well that ends well... */
return 0;
}
short cad3dobj_as_raw( FILE *fp, const CAD3D_OBJECT *obj,
const CAD3D_HEADER *head )
{
unsigned short loop;
short retval;
RGB_TRIAD colour;
char tmp[9];
if( fp == NULL || obj == NULL )
return -1;
if( flags & NOISY )
fprintf( stderr, "Dumping %s, %d triangles...\n", obj->name,
obj->num_triangles );
if( flags & VERBOSE )
fprintf( stderr, "Dumping %s..